#include <unistd.h>
#include "stdio.h"
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_gpio.h"
#include "hi_io.h"

#define LED_GPIO 9      // LED控制引脚 (GPIO9)
#define BUTTON_GPIO 5   // 按钮输入引脚 (GPIO5)

static void ButtonLedTask(void *arg)
{
    (void)arg;
    
    // 初始化LED GPIO (输出模式)
    IoTGpioInit(LED_GPIO);
    IoTGpioSetDir(LED_GPIO, IOT_GPIO_DIR_OUT);
    IoTGpioSetOutputVal(LED_GPIO, 1); // 初始状态: 灯灭
    
    // 初始化按钮 GPIO (输入模式)
    IoTGpioInit(BUTTON_GPIO);
    hi_io_set_pull(BUTTON_GPIO, HI_IO_PULL_UP);  // 启用上拉电阻
    hi_io_set_func(BUTTON_GPIO, HI_IO_FUNC_GPIO_5_GPIO);  // 设置GPIO5为GPIO功能
    IoTGpioSetDir(BUTTON_GPIO, IOT_GPIO_DIR_IN);
    
    uint8_t lastButtonState = 1;  // 默认上拉状态为高电平(1)
    // 此处LED低电平(0)表示灯亮，高电平(1)表示灯灭
    uint8_t ledState = 1;         // LED初始状态: 关闭
    
    while (1) {
        // 读取按钮状态 (0=按下, 1=释放)
        uint8_t buttonState;
        IoTGpioGetInputVal(BUTTON_GPIO, &buttonState);
        
        // 按钮状态变化时更新LED
        if (buttonState != lastButtonState) {
            // 按钮按下 (下降沿)
            if (buttonState == 0) {
                ledState = 0;
                IoTGpioSetOutputVal(LED_GPIO, ledState);
                printf("HI_GPIO_VALUE_1\n"); // 灯亮时打印消息
            }
            // 按钮释放 (上升沿)
            else {
                ledState = 1;
                IoTGpioSetOutputVal(LED_GPIO, ledState);
                printf("HI_GPIO_VALUE_0\n"); // 灯灭时打印消息
            }
            
            lastButtonState = buttonState;
            usleep(20000);  // 状态变化后添加去抖延时
        }

    }
}

void ButtonLedDemo(void)
{
    osThreadAttr_t attr = {
        .name = "ButtonLedTask",        // 任务名称
        .attr_bits = 0U,                // 任务属性位
        .cb_mem = NULL,                 // 任务控制块内存
        .cb_size = 0U,                  // 任务控制块大小
        .stack_mem = NULL,              // 任务栈内存
        .stack_size = 1024,             // 任务栈大小
        .priority = osPriorityNormal,   // 任务优先级
    };

    if (osThreadNew((osThreadFunc_t)ButtonLedTask, NULL, &attr) == NULL) {
        printf("[ButtonLed] Failed to create task!\n");
    }
}

SYS_RUN(ButtonLedDemo);